聊天室界面
前面已經學到了,如何畫出一個聊天泡泡,以及增加小鍵盤消失的使用者體驗。在這篇將會提到,如何結合 recyclerView 去達到聊天室的畫面。
簡單來講,我的 data-class 裡面記載著是誰傳的,以及傳的訊息內容,而我的 recyclerView 就依照是誰傳的的資訊,去判斷出現在應該要使用哪個 background ,因為不同的 background 可以反應出現在是 bot 還是 user。
做出一個 data-class
class chatMsg{
@Parcelize
data class Data(val from: String, val msg: String?): Parcelable
}
裡頭包含了誰傳的,以及要傳出去的訊息文字。
做出兩個 view holder 的 layout

viewHolder 可以由前篇的背景概念做出來,也可以參考上面附的程式碼唷!回傳相對應的 viewHolder
當把想要的 layout 建出來之後,就是在對的時間做回傳啦!我是透過getItemViewType 先去設定現在的 item 應該要為哪個 type,接著在 onCreateViewHolder 接收 type,並且回傳正確的 viewHolder 回去,就會看到一左一右的聊天泡泡出現囉!
override fun getItemViewType(position: Int): Int {
if(msgList[position].from == "bot"){
return BOT
}else if(msgList[position].from == "user"){
return USER
}
return super.getItemViewType(position)
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
val viewBot = LayoutInflater.from(viewGroup.context).inflate(R.layout._5_bot_msg, viewGroup, false)
val viewUser = LayoutInflater.from(viewGroup.context).inflate(R.layout._5_user_msg, viewGroup, false)
if(viewType == BOT)
return MyViewHolder(viewBot)
else if(viewType == USER)
return MyViewHolder(viewUser)
return MyViewHolder(viewBot)
}
User 新增訊息
設定該則訊息是 from user,並且記得一定要 update,這個 update 就是自己寫好的 notifyDataSetChanged(),這樣新的資料才會秀在畫面上!
我還有做一點增加使用者體驗的部分,就是當按下送出之後,聊天頁面自動滾動到最下面的位置,也就是剛剛新送出去的訊息,是透過 smoothScrollToPosition 達到這效果的。
viewRoom.sendBtn.setOnTouchListener { view, motionEvent ->
if(viewRoom.texting.text.toString() != "") {
msgList.add(chatMsg.Data("user", viewRoom.texting.text.toString()))
chatAdapter.update(msgList)
viewRoom.chatRoom.smoothScrollToPosition(msgList.size-1)
viewRoom.texting.text.clear()
}
return@setOnTouchListener false
}